package bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;

import modelo.Categoria;
import modelo.Contrato;
import modelo.Estado;
import modelo.Freelancer;
import modelo.Habilidade;
import modelo.Usuario;
import util.JSFUtil;
import dao.ContratoDAO;
import dao.FreelancerDAO;
import dao.UsuarioDAO;
import modelo.Nacionalidade;

@ManagedBean
@ViewScoped
public class FreelancerBean implements Serializable {

    private Freelancer freelancer = new Freelancer();
    private Estado estadoSelecionado = new Estado();
    private Habilidade habSelecionada = new Habilidade();
    private Habilidade habRemove = new Habilidade();
    private List<Habilidade> habilidades = new ArrayList<Habilidade>();
    private Categoria categoria = new Categoria();
    private Nacionalidade nacao = new Nacionalidade();
    @ManagedProperty(value = "#{usuarioSessaoBean.usuario}")
    private Usuario usuarioSessao;
    private Freelancer freelancerPerfil;
    private List<Contrato> contratos;
    private EntityManager entityManager;

    public FreelancerBean() {
    }

    @PostConstruct
    public void iniciar() {
        if (usuarioSessao instanceof Freelancer) {
            entityManager = JSFUtil.getEntityManager();
            UsuarioDAO usuarioDAO = new UsuarioDAO(entityManager);

            freelancerPerfil = new FreelancerDAO(entityManager)
                    .consultar(usuarioSessao.getId());

            estadoSelecionado = freelancerPerfil.getCidade().getEstado();
        }
    }

    public void salvar() {

        if (!freelancer.validarConfirmacao()) {
            JSFUtil.addMessage("Senhas n�o coincidem");
            return;
        }



        entityManager = JSFUtil.getEntityManager();

        UsuarioDAO usuarioDAO = new UsuarioDAO(entityManager);

        if (usuarioDAO.existeLogin(freelancer.getLogin())) {
            JSFUtil.addMessage(FacesMessage.SEVERITY_ERROR, "Login informado existe");
            return;
        }

        usuarioDAO.inserir(freelancer);

        // manager.getTransaction().commit();
        JSFUtil.addMessage("Registro salvo com sucesso");
        freelancer = new Freelancer();

    }

    public void alterar() {

        entityManager = JSFUtil.getEntityManager();

        UsuarioDAO usuarioDAO = new UsuarioDAO(entityManager);

        usuarioDAO.atualizar(freelancerPerfil);

        // manager.getTransaction().commit();
        JSFUtil.addMessage("Registro alterado com sucesso");
        freelancer = new Freelancer();

    }

    public Freelancer getFreelancer() {
        return freelancer;
    }

    public void setFreelancer(Freelancer freelancer) {
        this.freelancer = freelancer;
    }

    public Estado getEstadoSelecionado() {
        return estadoSelecionado;
    }

    public void setEstadoSelecionado(Estado estadoSelecionado) {
        this.estadoSelecionado = estadoSelecionado;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public Habilidade getHabSelecionada() {
        return habSelecionada;
    }

    public void setHabSelecionada(Habilidade habSelecionada) {
        this.habSelecionada = habSelecionada;
    }

    public List<Habilidade> getHabilidades() {
        return habilidades;
    }

    public void setHabilidades(List<Habilidade> habilidades) {
        this.habilidades = habilidades;
    }

    public Categoria getCategoria() {
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }

    public Nacionalidade getNacao() {
        return nacao;
    }

    public void setNacao(Nacionalidade nacao) {
        this.nacao = nacao;
    }

    public void adicionarHabilidade() {
        this.habilidades.add(habSelecionada);
        //System.err.println("sdljfhksdjfhsdjkfhkjsdhfkjsdhkfsdkjfhjksdh");

    }

    public void adicionarHabilidadeNoPerfil() {

        List<Habilidade> habilidades = freelancerPerfil.getHabilidades();
        if (habSelecionada == null || habilidades.contains(habSelecionada)) {
            return;
        }
        this.freelancerPerfil.getHabilidades().add(habSelecionada);

    }

    public void adicionarHabilidadeNoCadastro() {
        List<Habilidade> habilidades = freelancer.getHabilidades();
        if (habSelecionada == null || habilidades.contains(habSelecionada)) {
            return;
        }
        this.freelancer.getHabilidades().add(habSelecionada);
    }

    public void removerHabilidade() {
        List<Habilidade> habilidades = freelancerPerfil.getHabilidades();
        habilidades.remove(habRemove);
    }

    public Usuario getUsuarioSessao() {
        return usuarioSessao;
    }

    public void setUsuarioSessao(Usuario usuarioSessao) {
        this.usuarioSessao = usuarioSessao;
    }

    public Freelancer getFreelancerPerfil() {
        return freelancerPerfil;
    }

    public void setFreelancerPerfil(Freelancer freelancerPerfil) {
        this.freelancerPerfil = freelancerPerfil;
    }

    public Double getNotaGeral() {
        entityManager = JSFUtil.getEntityManager();
        return new ContratoDAO(entityManager).calcularMedia(freelancerPerfil);

    }

    public List<Contrato> getContratos() {
        if (contratos == null) {
            this.contratos = new ContratoDAO(entityManager)
                    .listContratoPorFreelancer(freelancerPerfil);
        }

        return contratos;

    }

    public void setContratos(List<Contrato> contratos) {
        this.contratos = contratos;
    }

    public Habilidade getHabRemove() {
        return habRemove;
    }

    public void setHabRemove(Habilidade habRemove) {
        this.habRemove = habRemove;
    }
}
